"""
Implementacion de algunos algoritmos de procesado de imagenes

Autor: Gonzalo Luzardo Morocho
gluzardo@espol.edu.ec, gonchalox@gmail.com
"""

from Imagex import *
from numpy import *
from ErrorControl import *

# IMAGE PROCESSING METHODS

#Get luma from rgb
def getLuma((r,g,b)):
	return (r * 0.29 + g * 0.59 + b * 0.11)

# Binariza una imagen en niveles de grises
def binaryze(image,umbral):
	if(image._colorMode != GRAY):
		raise ImageProcessingError("Solo se pueden binarizar imagenes en escala de grises")
	for y in range(0,image._height):
		for x in range(0,image._width):
			if(image[x,y] >= umbral):
				image[x,y] = COLOR_MAX_VALUE
			else:
				image[x,y] = COLOR_MIN_VALUE

#Convierte una imagen RGB en niveles de grises
def rgb2gray(image):
	if(image._colorMode != RGB):
		raise ImageProcessingError("Solo se pueden binarizar imagenes en escala de grises")
	mat = array(zeros([image._height,image._width]),dtype=uint8)
	img = Imagex()
	#Obtiene el canal luma
	for y in range(0,image._height):
		for x in range(0,image._width):
			mat[y,x] = getLuma(image[x,y])
	img.setData(mat)
	return img

#Obtiene una subimagen a partir de la imagen original
def getSubImage(image,x,y,w,h):
	if(x+w > image._width or y+h > image._height):
		raise ImageProcessingError("La subimagen no esta dentro de la imagen original")
	subArray = image._array[y:y+h,x:x+w]
	img = Imagex()
	img.setData(subArray)
	return img
	
	
#Get invert gray 
def getInvertGrayColor(color):
	return COLOR_MAX_VALUE-color

#Get invert RGB color
def getInvertRGBColor(color):
	return array([COLOR_MAX_VALUE-color[0],COLOR_MAX_VALUE-color[1],COLOR_MAX_VALUE-color[2]]);

	
#Invierte los colores a una imagen
def invertImage(image):
	if(image._colorMode == GRAY):
		image._array[:,:] = getInvertGrayColor(image._array[:,:])
	elif(image._colorMode == RGB):
		for y in range(0,image._height):
			for x in range(0,image._width):
				image._array[y,x] = getInvertRGBColor(image._array[y,x])
